using System;
using Curriculum.Business;
using SincroCliente.SincroServices;
using System.Collections;
using System.Xml;
using System.IO;


namespace SincroCliente
{
	/// <summary>
	/// Summary description for ActualizadorMetadatosLocal.
	/// </summary>
	public class ActualizadorMetadatosLocal : ActualizadorDeDatos
	{
		ArrayList _componentes;

		// Acceder por medio del Factory.
		internal ActualizadorMetadatosLocal() : base()
		{
			_componentes = new ArrayList();
		}


		internal ArrayList Componentes
		{
			get { return _componentes; }	
		}


		internal override void Ejecutar()
		{								
			ComponenteMetadato[] componentesReq = new ComponenteMetadato[_componentes.Count];
			_componentes.CopyTo(componentesReq);

			RespuestaMetadatos resp = this._service.GetMetadatos(GetUsuarioSerializable(), componentesReq);

			if (resp.Codigo != ResultadoServicio.OK)
			{
				throw new Exception(resp.Mensaje);
			}
			else
			{
				// Guardao la Nueva Version Metadatos en Directorio Correspondiente.
				string pathDeTrabajo = System.Configuration.ConfigurationSettings.AppSettings[Constants.APP_DIR_TRABAJO];
				string pathMetadatos = pathDeTrabajo + Constants.DIRECTORIO_METADATOS + Constants.VERSION_ABIERTA_KEY;

				foreach (SincroServices.ArchivoXML archivo in resp.Archivos)
				{
					string pathDestino = string.Format(@"{0}\{1}", pathMetadatos, archivo.Nombre);

					StreamWriter writer = new StreamWriter(pathDestino);
					XmlTextWriter xmlWriter = new XmlTextWriter(writer);								
					XmlDocument xmlDoc = new XmlDocument();					
					archivo.XmlDoc.WriteTo(xmlWriter);	

					xmlWriter.Close();
					writer.Close();					
				}
			}
		}

		public override string GetDescripcionDatosActualizados()
		{
			return "Metadatos";
		}

		#region Metodos No usados 
//		public Modelo.Antecedente ConvertirSerAModelo(SincroServices.AntecedenteMetadato antMetSer)
//		{
//			Modelo.Antecedente antMeta = new Antecedente();
//			
//			// Copio los antecedentes hijos
//			ArrayList listaAnt = new ArrayList();
//			foreach (SincroServices.AntecedenteMetadato antMetaHijo in antMetSer.AntecedenteMetadatos)
//			{
//				listaAnt.Add(ConvertirSerAModelo(antMetaHijo));
//			}
//
//			antMeta.Antecedentes = new Antecedente[listaAnt.Count];
//			listaAnt.CopyTo(antMeta.Antecedentes);
//
//			// Copio los atributos
//			ArrayList listaAtr = new ArrayList();
//			foreach (SincroServices.AtributoMetadato atrMeta in antMetSer.AtributoMetadatos)
//			{
//				listaAtr.Add(ConvertirSerAModelo(atrMeta));
//			}
//
//			antMeta.Atributos = new Atributo[listaAtr.Count];
//			listaAtr.CopyTo(antMeta.Atributos);
//
//			// Copio el resto...
//			antMeta.EsAgregacion = antMetSer.EsAgregacion;
//			antMeta.IdAntecente = antMetSer.Id;
//			antMeta.IdPadre = antMetSer.IdPadre;
//			antMeta.Nombre = antMetSer.Nombre;			
//
//			return antMeta;
//		}
//
//		public Modelo.Atributo ConvertirSerAModelo(SincroServices.AtributoMetadato atrMetaSer)
//		{
//			Modelo.Atributo atrMeta = new Atributo();
//
//			atrMeta.IdAtributo = atrMetaSer.IdAtributo;
//			atrMeta.IdTipoDato = atrMetaSer.IdTipoDato;
//			atrMeta.Longitud = atrMetaSer.Longitud;
//			atrMeta.Nombre = atrMetaSer.Nombre;
//			atrMeta.Opcional = atrMetaSer.Opcional;
//
//			return atrMeta;
//		}
		#endregion

	}
}
